03 - Podstawowe funkcje OpenCV

Przetwarzanie i Analiza Obrazów

Politechnika Poznańska, Instytut Robotyki i Inteligencji Maszynowej

Ćwiczenie laboratoryjne 3: Podstawowe funkcje OpenCV.

Powrót do spisu treści ćwiczeń laboratoryjnych

W tym ćwiczeniu:

1. Cel ćwiczenia

Celem ćwiczenia jest poznanie podstawowych funkcji OpenCV używanych w codziennej pracy z obrazem: konwersji kolorów, zmiany rozmiaru obrazu oraz analizy histogramów.

2. Wstęp teoretyczny

Przed wykonaniem zadań przeczytaj poniższe informacje i uruchom przykłady. Zwróć uwagę nie tylko na składnię funkcji, ale też na to, po co używa się ich w praktyce.

2.1. Konwersja kolorów i przestrzenie barw

Obraz kolorowy można reprezentować w różnych przestrzeniach barw. W OpenCV domyślnie używany jest zapis BGR, ale w zależności od zadania wygodniejsze mogą być inne reprezentacje.

Najczęściej spotykane przestrzenie barw:

Po co wykonuje się konwersję kolorów:

W OpenCV konwersję wykonuje się funkcją cv2.cvtColor(...).

Dokumentacja: https://docs.opencv.org/5.x/df/d9d/tutorial_py_colorspaces.html

2.1.1. Przykład - konwersja do skali szarości i HSV

import cv2

img = cv2.imread('image.jpg')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

cv2.imshow('Oryginal', img)
cv2.imshow('Gray', gray)
cv2.imshow('HSV', hsv)

cv2.waitKey(0)
cv2.destroyAllWindows()

Uwaga: Obraz w przestrzeni HSV po zwykłym wyświetleniu nie będzie wyglądał „naturalnie”, ale nadal zawiera informacje użyteczne do dalszego przetwarzania, np. filtrowania koloru.

2.2. Skalowanie obrazów

Skalowanie polega na zmianie rozmiaru obrazu. Jest to potrzebne między innymi wtedy, gdy:

Do zmiany rozmiaru używa się funkcji cv2.resize(...).

Najczęściej spotykane metody interpolacji:

Dokumentacja: https://docs.opencv.org/5.x/da/d54/group__imgproc__transform.html

2.2.1. Przykład - zmiana rozmiaru obrazu

import cv2

img = cv2.imread('image.jpg')

small = cv2.resize(img, (200, 200))
big = cv2.resize(img, None, fx=1.5, fy=1.5, interpolation=cv2.INTER_CUBIC)

cv2.imshow('Oryginal', img)
cv2.imshow('Pomniejszony', small)
cv2.imshow('Powiekszony', big)
cv2.waitKey(0)
cv2.destroyAllWindows()

Uwaga: Gdy korzystasz z fx i fy, parametr rozmiaru ustaw na (0, 0) lub None. Gdy podajesz dokładny rozmiar docelowy, użyj argumentu dsize=(szerokosc, wysokosc).

2.3. Histogramy

Histogram obrazu pokazuje, ile pikseli ma daną wartość jasności lub daną wartość w wybranym kanale koloru. Jest to proste, ale bardzo użyteczne narzędzie do analizy obrazu.

Po co analizuje się histogram:

W OpenCV histogram można obliczyć funkcją cv2.calcHist(...).

Dokumentacja: https://docs.opencv.org/5.x/d1/db7/tutorial_py_histogram_begins.html

2.3.1. Przykład - histogram obrazu w skali szarości

Uwaga: Może być konieczne zainstalowanie biblioteki matplotlib do wyświetlania wykresów: pip install matplotlib.

import cv2
from matplotlib import pyplot as plt

img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)

hist = cv2.calcHist([img], [0], None, [256], [0, 256])

plt.title('Histogram obrazu grayscale')
plt.xlabel('Wartosc piksela')
plt.ylabel('Liczba pikseli')
plt.plot(hist)
plt.xlim([0, 256])
plt.show()

Uwaga: Jeśli większość wartości histogramu skupia się po lewej stronie, obraz jest raczej ciemny. Jeśli po prawej stronie, obraz jest raczej jasny. Wąski histogram zwykle oznacza niski kontrast.

3. Zadania do samodzielnego wykonania

Każde zadanie wykonaj w osobnym pliku Python (zad1.py, zad2.py, …).

💥 Zadanie 1 - Konwersja do różnych przestrzeni barw 💥

  1. Wczytaj wybrany obraz kolorowy.

  2. Przekonwertuj go do skali szarości korzystając z cv2.COLOR_BGR2GRAY.

  3. Wczytaj ten sam obraz do innej zmiennej korzystając z cv2.imread(..., cv2.IMREAD_GRAYSCALE).

  4. Porównaj oba obrazy w skali szarości, sprawdź, czy są identyczne.

💥 Zadanie 2 - Wydzielenie koloru w przestrzeni HSV 💥

  1. Wczytaj obraz zawierający wyraźny obiekt w wybranym kolorze, np. czerwonym, zielonym lub niebieskim.

  2. Przekonwertuj obraz do przestrzeni HSV.

  3. Zastosuj cv2.inRange(...), aby wyznaczyć maskę dla wybranego koloru.

  4. Wyświetl obraz wejściowy, maskę i wynik po nałożeniu maski.

Uwaga: To zadanie pokazuje, dlaczego przestrzeń HSV jest często wygodniejsza od BGR przy segmentacji kolorów.

💥 Zadanie 3 - Skalowanie obrazu i porównanie interpolacji 💥

  1. Wczytaj wybrany obraz.

  2. Zmniejsz go dwukrotnie, korzystając z cv2.INTER_AREA.

  3. Powiększ go dwukrotnie, korzystając kolejno z:

  1. Wyświetl wyniki w osobnych oknach.

  2. Porównaj wizualnie jakość uzyskanych obrazów i zapisz krótką obserwację.

💥 Zadanie 4 - Histogramy kanałów koloru 💥

  1. Wczytaj obraz kolorowy.

  2. Oblicz osobne histogramy dla kanałów B, G i R (możesz to zrobić na raz lub osobno dla każdego kanału).

  3. Wyświetl wszystkie trzy histogramy na jednym wykresie.

  4. Porównaj, który kanał ma największy udział i jak wpływa to na wygląd obrazu.